<?php

class Controller_Cli {

    /**
     * execute
     * 执行
     *
     * @return void
     */
    public function execute() {

        // 获取参数列表
        $options = self::parseParameters();

        // 类名称
        $className = $options['n'];

        // 类名为空
        if (!$className) {
            throw new Yaf_Exception("To run a command, type 'php app_demo/backend/command.php -n className [args]'");
        }

        // 类不存在
        if (!class_exists($className)) {
            throw new Yaf_Exception('class ' . $className . ' is not exists');
        }

        // 实例化
        $object = new $className($options);

        // 默认方法
        $methodName = 'main';

        // 方法是否存在
        if (!method_exists($object, $methodName)) {
            throw new Yaf_Exception($className . '::' . $methodName . ' is not exists');
        }

        // 执行
        Yaf_Application::app()->execute(array($object, $methodName));
    }

    /**
     * parseParameters
     * 分析从命令行传入的参数
     *
     * 支持的类型：
     * -e
     * -e <value>
     * --long-param
     * --long-param=<value>
     * --long-param <value>
     * <value>
     *
     * @return array
     */
    public static function parseParameters() {

        $result = array();
        $params = $GLOBALS['argv'];

        reset($params);

        while (list($tmp, $p) = each($params)) {
            if ($p{0} == '-') {
                $pname = substr($p, 1);
                $value = true;

                if ($pname{0} == '-') {

                    // long-opt (--<param>)
                    $pname = substr($pname, 1);

                    // 使用'='链接的long-opt: --<param>=<value>
                    if (strpos($p, '=') !== false) {
                        list($pname, $value) = explode('=', substr($p, 2), 2);
                    }
                }

                // 下一个参数
                $nextParm = current($params);
                if ($value === true && $nextParm !== false && $nextParm{0} != '-') {
                    list($tmp, $value) = each($params);
                }

                $result[$pname] = $value;
            } else {
                // 不以'-'或'--'开头的opt
                $result[] = $p;
            }
        }

        return $result;
    }
}
